package com.cskaoyan.javase.oop3._2inner._3static._1basic;

/**
 * 具体讲访问特点之前,先明确以下两个原则:
 *      1."好兄弟"原则,静态内部类和外围类之间的互相访问不受权限限制
 *      2.外围类和静态内部类本身相互独立,不会互相持有对象
 *          要想互相访问,直接创建各自对象就可以了
 *
 * 静态内部类的访问特点，主要从以下几个角度研究：
 *
 *      1.(重点)静态内部类内部访问外围类
 *      2.(重点)外围类访问静态内部类成员
 *      3.外部类访问静态内部类成员
 *          全程受权限限制
 *          直接创建静态内部类对象
 *
 *      4.静态内部类访问外部类成员
 *          可以,但是需要创建对象,全程受权限限制
 *
 * @since 11:18
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        // 直接创建静态内部类对象,成员位置的内部类引用都是"外围类类名.内部类类名"
        EnclosedClazz.NestedClazz nc = new EnclosedClazz.NestedClazz();
        System.out.println(nc.a);
        // System.out.println(nc.b);
    }
}

// 外围类
class EnclosedClazz {
    int a;
    private int b = 100;
    static int c = 300;
    static final int D = 400;

    public void testEnclosed() {
        NestedClazz nc = new NestedClazz();
        System.out.println(nc.a);
        System.out.println(nc.b);
    }

    // 静态内部类本身也是一个独立的类,只不过是借用外围类保护自己罢了
    static class NestedClazz {
        int a;
        private int b = 10;
        static int c = 30;
        static final int D = 40;

        public static void testStatic() {
            EnclosedClazz ec = new EnclosedClazz();
            System.out.println(ec.a);
            System.out.println(ec.b);
        }

        public void test() {
            System.out.println(a);
            System.out.println(b);
            // System.out.println(EnclosedClazz.this.a);
            EnclosedClazz ec = new EnclosedClazz();
            System.out.println(ec.a);
            System.out.println(ec.b);
        }
    }
}